# pdf_word_loaders_demo.py
import os
from langchain.document_loaders import PyPDFLoader, Docx2txtLoader
from reportlab.pdfgen import canvas
from docx import Document as DocxDocument


def pdf_word_loaders_demo():
    """PDF和Word文档加载器演示"""

    print("📊 PDF和Word文档加载器演示")
    print("=" * 40)

    # 1. 创建示例PDF文件
    print("1️⃣ PDF文档加载：")

    def create_sample_pdf():
        """创建示例PDF简历"""
        pdf_filename = "sample_resume.pdf"
        c = canvas.Canvas(pdf_filename)

        # 添加简历内容
        c.setFont("Helvetica", 12)

        # 标题
        c.drawString(100, 750, "Personal Resume - Wang Engineer")

        # 基本信息
        c.drawString(100, 700, "Name: Wang Engineer")
        c.drawString(100, 680, "Position: Senior Python Developer")
        c.drawString(100, 660, "Experience: 6 years")
        c.drawString(100, 640, "Phone: 13800138000")

        # 技能部分
        c.drawString(100, 600, "Technical Skills:")
        c.drawString(120, 580, "- Python, Django, Flask")
        c.drawString(120, 560, "- Machine Learning, TensorFlow")
        c.drawString(120, 540, "- PostgreSQL, MongoDB")
        c.drawString(120, 520, "- Docker, Kubernetes")

        # 工作经历
        c.drawString(100, 480, "Work Experience:")
        c.drawString(120, 460, "2020-2024: ByteDance - Senior Python Developer")
        c.drawString(120, 440, "- Led AI recommendation system development")
        c.drawString(120, 420, "- Improved system performance by 40%")

        c.drawString(120, 380, "2018-2020: Xiaomi - Python Developer")
        c.drawString(120, 360, "- Developed backend APIs for mobile apps")
        c.drawString(120, 340, "- Managed microservices architecture")

        c.save()
        return pdf_filename

    try:
        pdf_file = create_sample_pdf()
        print(f"   创建PDF文件：{pdf_file}")

        # 使用PyPDFLoader加载
        pdf_loader = PyPDFLoader(pdf_file)
        pdf_documents = pdf_loader.load()

        print(f"   PDF页数：{len(pdf_documents)}")
        print(f"   第一页内容长度：{len(pdf_documents[0].page_content)}字符")
        print(f"   PDF元数据：{pdf_documents[0].metadata}")
        print(f"   内容预览：{pdf_documents[0].page_content[:150]}...")

        # 清理PDF文件
        os.remove(pdf_file)

    except ImportError:
        print("   ⚠️ PDF处理需要安装reportlab: pip install reportlab")
    except Exception as e:
        print(f"   ❌ PDF处理错误：{e}")

    # 2. 创建示例Word文档
    print("\n2️⃣ Word文档加载：")

    def create_sample_docx():
        """创建示例Word简历"""
        docx_filename = "sample_resume.docx"
        doc = DocxDocument()

        # 添加标题
        title = doc.add_heading('个人简历 - 刘工程师', 0)

        # 基本信息
        doc.add_heading('基本信息', level=1)
        basic_info = doc.add_paragraph()
        basic_info.add_run('姓名：').bold = True
        basic_info.add_run('刘工程师\n')
        basic_info.add_run('职位：').bold = True
        basic_info.add_run('全栈开发工程师\n')
        basic_info.add_run('经验：').bold = True
        basic_info.add_run('7年\n')
        basic_info.add_run('电话：').bold = True
        basic_info.add_run('13700137000')

        # 技能部分
        doc.add_heading('技术技能', level=1)
        skills = doc.add_paragraph()
        skills.add_run('前端技术：').bold = True
        skills.add_run('JavaScript, TypeScript, React, Vue.js\n')
        skills.add_run('后端技术：').bold = True
        skills.add_run('Node.js, Python, Java\n')
        skills.add_run('数据库：').bold = True
        skills.add_run('MySQL, PostgreSQL, MongoDB\n')
        skills.add_run('DevOps：').bold = True
        skills.add_run('Docker, Jenkins, AWS')

        # 工作经历
        doc.add_heading('工作经历', level=1)

        # 第一份工作
        job1 = doc.add_paragraph()
        job1.add_run('2021-2024 字节跳动 - 高级全栈工程师\n').bold = True
        job1.add_run('• 负责抖音创作者平台前后端开发\n')
        job1.add_run('• 使用React和Node.js构建高性能Web应用\n')
        job1.add_run('• 优化系统架构，提升用户体验50%')

        # 第二份工作
        job2 = doc.add_paragraph()
        job2.add_run('2018-2021 美团 - 全栈开发工程师\n').bold = True
        job2.add_run('• 开发外卖商家管理系统\n')
        job2.add_run('• 实现微服务架构，支持高并发访问\n')
        job2.add_run('• 负责移动端H5页面开发')

        doc.save(docx_filename)
        return docx_filename

    try:
        docx_file = create_sample_docx()
        print(f"   创建Word文件：{docx_file}")

        # 使用Docx2txtLoader加载
        docx_loader = Docx2txtLoader(docx_file)
        docx_documents = docx_loader.load()

        print(f"   Word文档数量：{len(docx_documents)}")
        print(f"   文档内容长度：{len(docx_documents[0].page_content)}字符")
        print(f"   Word元数据：{docx_documents[0].metadata}")
        print(f"   内容预览：{docx_documents[0].page_content[:200]}...")

        # 清理Word文件
        os.remove(docx_file)

    except ImportError:
        print("   ⚠️ Word处理需要安装python-docx: pip install python-docx")
    except Exception as e:
        print(f"   ❌ Word处理错误：{e}")

    # 3. 文档格式对比
    print("\n3️⃣ 不同格式对比：")

    # 创建相同内容的不同格式文件
    content = """简历对比测试

姓名：测试工程师
职位：软件开发工程师
技能：Java, Python, JavaScript
经验：5年开发经验

这是用来测试不同文档加载器的示例内容。
包含中文和英文混合文本，用于验证编码处理。"""

    formats_comparison = []

    # TXT格式
    txt_file = "comparison.txt"
    with open(txt_file, "w", encoding="utf-8") as f:
        f.write(content)

    try:
        from langchain.document_loaders import TextLoader
        txt_loader = TextLoader(txt_file, encoding="utf-8")
        txt_docs = txt_loader.load()
        formats_comparison.append(("TXT", len(txt_docs), len(txt_docs[0].page_content)))
        os.remove(txt_file)
    except Exception as e:
        print(f"   TXT加载错误：{e}")

    print("   格式对比结果：")
    for format_name, doc_count, content_length in formats_comparison:
        print(f"     {format_name}: {doc_count}个文档, {content_length}字符")

    # 4. 加载器选择建议
    print("\n4️⃣ 加载器选择建议：")
    print("   📄 TXT文件 → TextLoader")
    print("     优点：简单快速，支持编码设置")
    print("     缺点：无格式信息")

    print("   📊 PDF文件 → PyPDFLoader")
    print("     优点：保留页面结构，提取元数据")
    print("     缺点：复杂PDF可能解析不完整")

    print("   📝 Word文件 → Docx2txtLoader")
    print("     优点：良好的文本提取，支持样式")
    print("     缺点：丢失复杂格式信息")


# 运行演示
pdf_word_loaders_demo()
